home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Workbench Add-On
/
Workbench Add-On - Volume 1.iso
/
BBS-Archive
/
Comm
/
AmiTCP30b2.lha
/
src
/
appl
/
napsaterm
/
tel_opt.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-05-14
|
3KB
|
169 lines
/*
* $Id: tel_opt.c,v 3.1 1994/05/14 14:17:07 ppessi Exp $
*
* Author: Tomi Ollila <too@ajk.tele.fi>
*
* Copyright © 1993, 1994 AmiTCP/IP Group, <amitcp-group@hut.fi>
* Helsinki University of Technology, Finland.
* All rights reserved.
*
* Created: Thu Apr 7 15:33:19 1994 too
* Last modified: Fri May 13 02:37:51 1994 ppessi
*
* HISTORY
* $Log: tel_opt.c,v $
* Revision 3.1 1994/05/14 14:17:07 ppessi
* initial revision
*
* Revision 3.1 1994/04/17 11:31:54 too
* initial revision
*
*/
#include "telnet.h"
#include <arpa/telnet.h>
#include "tel_opt.h"
#include "tel_iacout.h"
static long telnet_flags; /* telnet state information */
#define TF_ECHO (1<<0)
#define TF_SGA (1<<1)
#define TF_TTYPE (1<<2)
static void to_echo(u_char wwdd, u_char c);
static void to_sga(u_char wwdd, u_char c);
static void to_naws(u_char wwdd, u_char c);
static void to_ttype(u_char wwdd, u_char c);
static void to_notsup(u_char wwdd, u_char c);
void telopt(u_char wwdd, u_char c)
{
switch (c) {
case TELOPT_ECHO:
to_echo(wwdd, c);
break;
case TELOPT_SGA:
to_sga(wwdd, c);
break;
case TELOPT_NAWS:
to_naws(wwdd, c);
break;
case TELOPT_TTYPE:
to_ttype(wwdd, c);
break;
default:
to_notsup(wwdd, c);
break;
}
}
static void to_notsup(u_char wwdd, u_char c)
{
if (wwdd == WILL)
putiac2(DONT, c);
else if (wwdd == DO)
putiac2(WONT, c);
}
/*
* Handle local echo
*/
static void to_echo(u_char wwdd, u_char c)
{
if (wwdd == DO) {
putiac2(WONT, c);
return;
}
else if (wwdd == DONT)
return;
if (telnet_flags & TF_ECHO) {
if (wwdd == WILL) {
return;
}
}
else
if (wwdd == WONT) {
return;
}
#ifdef notyet
/* XXX if somebody will someday implement linemode for Napsaterm... */
if (unit->u_charmode != CHM_OFF)
telnet_flags ^= TF_ECHO;
#endif
if ((telnet_flags ^= TF_ECHO) & TF_ECHO)
putiac2(DO, c);
else
putiac2(DONT, c);
}
/*
* Handle suppress-go-ahead
*/
static void to_sga(u_char wwdd, u_char c)
{
if (telnet_flags & TF_SGA) {
if (wwdd == WILL)
return;
}
else
if (wwdd == WONT)
return;
if ((telnet_flags ^= TF_SGA) & TF_SGA)
putiac2(DO, c);
else
putiac2(DONT, c);
}
/*
* Handle window size
*/
static void to_naws(u_char wwdd, u_char c)
{
if (okwinch) {
if (wwdd == DO)
return;
}
else
if (wwdd == DONT)
return;
okwinch = (wwdd == DO);
if (okwinch) {
putiac2(WILL, c);
do_naws(); /* Send the initial size */
} else {
putiac2(WONT, c);
}
}
/*
* Handle terminal type
*/
static void to_ttype(u_char wwdd, u_char c)
{
if (telnet_flags & TF_TTYPE) {
if (wwdd == DO)
return;
}
else
if (wwdd == DONT)
return;
/* Flip the flag and send WILL/WONT */
if ((telnet_flags ^= TF_TTYPE) & TF_TTYPE) {
putiac2(WILL, c);
} else {
putiac2(WONT, c);
}
}